home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / c / library / dos / diverses / cexpress / printer / prtcntr.asm < prev    next >
Encoding:
Assembly Source File  |  1989-05-03  |  6.2 KB  |  215 lines

  1. ;void  prt_center(strg,field_size,fill_char,printer_codes)
  2. ;  char  *strg,fill_char,*printer_codes;
  3. ;  int   field_size;
  4.  
  5.     EXTRN  _memory_model:byte
  6.     EXTRN  _error_code:byte
  7.     EXTRN  _time_out:byte
  8.  
  9. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  10.     ASSUME  CS:_TEXT
  11.     PUBLIC  _prt_center
  12. _prt_center proc near
  13.     push bp            ;
  14.     mov  bp,sp        ;
  15.     push di            ;
  16.     push si            ;
  17.     push ds            ;
  18.     cmp  _memory_model,0    ;near or far?
  19.     jle  begin        ;jump if near
  20.     inc  bp            ;else add 2 to BP
  21.     inc  bp            ;
  22. begin:    jmp  short A1
  23. keep_count   dw ?
  24. keep_target  dw ?
  25. strg_len     db ?
  26. right_border dw ?
  27. field_size   db ?
  28. fill_char    db ?
  29. codes_seg    dw ?
  30. codes_ofs    dw ?
  31. A1:    mov  ah,1        ;BIOS func to init prtr
  32.     sub  dx,dx        ;choose LPT1
  33.     int  17h        ;initialize the prtr port
  34.     sub  ax,ax        ;clear AX
  35.     mov  es,ax        ;point ES to 0000:0000
  36.     mov  dx,es:[408h]    ;get LPT1 base address
  37.     mov  _error_code,1    ;1 = printer error
  38.     mov  al,_time_out    ;get _time_out seconds
  39.     cmp  _memory_model,2    ;data near or far?
  40.     jb   B1            ;jump if near    
  41.     lds  si,dword ptr[bp+4] ;DS:SI pts to Strg
  42.     mov  bh,[bp+8]        ;field size
  43.     mov  bl,[bp+10]        ;fill char
  44.     les  di,dword ptr[bp+12] ;ES:DI pts to PrinterCodes
  45.     jmp  short B2        ;
  46. B1:    mov  si,[bp+4]        ;NEAR case
  47.     mov  bh,[bp+6]        ;
  48.     mov  bl,[bp+8]        ;
  49.     mov  di,[bp+10]        ;
  50.     push ds            ;
  51.     pop  es            ;
  52. B2:    mov  cs:field_size,bh    ;store parameters for later
  53.     mov  cs:fill_char,bl    ;    
  54.     mov  cs:codes_seg,es    ;
  55.     mov  cs:codes_ofs,di    ;
  56.     or   al,al        ;don't allow 0 seconds in time out
  57.     jnz  C1            ;
  58.     mov  al,3        ;default to 3 seconds
  59. C1:    mov  cl,18        ;18 ticks per second
  60.     mul  cl            ;
  61.     mov  cs:keep_count,ax    ;save count
  62.     sub  cx,cx        ;clear CX
  63.     mov  cs:strg_len,0    ;in case null string
  64.     cmp  byte ptr[si],0    ;test for null input string
  65.     je   F1            ;
  66.     push si            ;go count number code chars in Strg
  67.     sub  cx,cx        ;also count string length
  68.     sub  al,al        ;AL counts control codes
  69. D1:    mov  ah,[si]        ;get char from Strg
  70.     or   ah,ah        ;terminating null yet?
  71.     jz   E2            ;quit loop if so
  72.     cmp  ah,128        ;test lower end of range
  73.     jb   E1            ;jump if below
  74.     cmp  ah,159        ;test upper limit
  75.     ja   E1            ;jump if above
  76.     inc  al            ;else inc code counter
  77. E1:    inc  si            ;forward string pointer
  78.     inc  cx            ;inc string length counter
  79.     jmp  short D1        ;go check next char
  80. E2:    pop  si            ;
  81.     mov  cs:strg_len,cl    ;save string length
  82.     sub  ah,ah        ;clear AH
  83.     sub  cx,ax        ;num printed chrs in Strg
  84. F1:    sub  ax,ax        ;clear AX
  85.     mov  al,cs:field_size    ;line length (255 max)
  86.     or   al,al        ;test for zero
  87.     jz   M1            ;quit if zero
  88.     cmp  cx,ax        ;compare Strg, field lens
  89.     jbe  G1            ;jump if Strg <=
  90.     mov  cx,ax        ;print only part of Strg
  91.     mov  cs:strg_len,cl    ;
  92.     sub  ax,ax        ;use 0 in calculation
  93.     jmp  short H1        ;jump below
  94. G1:    sub  ax,cx        ;minus string length
  95. H1:    mov  cx,ax        ;copy in CX
  96.     shr  ax,1        ;div by 2
  97.     sub  cx,ax        ;remainder
  98.     mov  cs:right_border,cx    ;save right border length
  99.     mov  cx,ax        ;left border
  100.     jcxz J1            ;jump if no left border
  101. I1:    mov  al,cs:fill_char    ;fetch fill character
  102.     call Writeit        ;print a char
  103.     or   ah,ah        ;check for printer error
  104.     jz   M1            ;quit if error
  105.     loop I1            ;go do next on left
  106. J1:    mov  cl,cs:strg_len    ;
  107.     mov  ch,cs:fill_char    ;copy fill char in CH
  108.     or   cl,cl        ;test for null string
  109.     jz   R1            ;jump ahead if null
  110. K1:    mov  al,[si]        ;get a character
  111.     cmp  al,128        ;test if control code
  112.     jb   P1            ;jump if below range
  113.     cmp  al,159        ;test if above
  114.     ja   P1            ;jump if above
  115.     push cx            ;save Strg len ctr
  116.     push si            ;save Strg pos ptr
  117.     push ax            ;point ES:DI to PrinterCodes
  118.     mov  ax,cs:codes_seg
  119.     mov  es,ax
  120.     mov  di,cs:codes_ofs
  121.     pop  ax
  122.     sub  al,128        ;count codes from 0
  123.     mov  cl,6        ;times six bytes
  124.     mul  cl            ;offset in PrinterCodes
  125.     add  di,ax        ;SI pts to code sequence
  126.     sub  cx,cx        ;clear CX
  127.     mov  cl,es:[di]        ;get string descriptor
  128.     jcxz O1            ;quit loop if null
  129. L1:    inc  di            ;forward ptr
  130.     mov  al,[di]        ;get code character
  131.     call Writeit        ;
  132.     or   ah,ah        ;printer error?
  133.     jnz  N1            ;continue if not
  134.     pop  si            ;restore Strg pos ptr
  135.     pop  cx            ;restore Strg len ctr
  136. M1:    jmp  short U1        ;go quit routine
  137. N1:    loop L1            ;go do next
  138. O1:    pop  si            ;restore Strg pos ptr
  139.     pop  cx            ;restore Strg len ctr
  140.     jmp  short Q1        ;go get next char in Strg
  141. P1:    call Writeit        ;
  142.     or   ah,ah        ;proc returned error?
  143.     jz   U1            ;quit if so
  144. Q1:    inc  si            ;forward Strg ptr
  145.     dec  cl            ;dec Strg len ctr
  146.     jnz  K1            ;loop till finished
  147. R1:    mov  al,ch        ;fill char to AL
  148.     mov  cx,cs:right_border    ;right border length
  149.     jcxz T1            ;quit if no right border
  150.     mov  ch,al        ;copy back to CH
  151. S1:    mov  al,ch        ;fill char to AL
  152.     call Writeit        ;
  153.     or   ah,ah        ;check for printer error
  154.     jz   U1            ;quit if error
  155.     dec  cl            ;dec border len counter
  156.     jnz  S1            ;loop till finished
  157. T1:    pop  ds            ;
  158.     dec  _error_code    ;0 = no error
  159.     jmp  short V1        ;
  160. U1:    pop  ds            ;
  161. V1:    pop  si            ;
  162.     pop  di            ;
  163.     pop  bp            ;
  164.     cmp  _memory_model,0    ;quit
  165.     jle  quit        ;
  166.     db   0CBh        ;RET far
  167. quit:    ret            ;RET near
  168. Writeit    PROC
  169.     out  dx,al        ;send to output data register
  170.     inc  dx            ;forward to status register
  171.     push cx            ;save string counter
  172.     call GetBiosCount    ;get timer reading
  173.     mov  bx,cx        ;make copy
  174.     add  cx,cs:keep_count    ;add delay count
  175.     cmp  bx,cx        ;if timer doesn't turn over...
  176.     jb   W1            ;go ahead
  177.     mov  cx,cs:keep_count    ;otherwise, extend delay
  178. W1:    mov  cs:keep_target,cx    ;save target count on stack
  179. Wait:    in   al,dx        ;get status value
  180.     test al,8        ;test for printer error
  181.     jz   Error        ;
  182.     test al,80h        ;test for Printer Ready
  183.     jnz  Ready        ;jump if ready
  184. Error:    call GetBiosCount    ;
  185.     cmp  cx,cs:keep_target    ;compare to target
  186.     jb   Wait        ;    
  187.     mov  bl,1        ;1 = error
  188.     pop  cx            ;restore string counter
  189.     mov  ah,0        ;return code for failure
  190.     jmp  short X1        ;return
  191. Ready:    pop  cx            ;restore string counter
  192.     inc  dx            ; output control register
  193.     mov  al,13        ;bits for strobe signal
  194.     out  dx,al        ;send the signal
  195.     dec  al            ;change to strobe OFF
  196.     out  dx,al        ;send the signal
  197.     dec  dx            ;point back to
  198.     dec  dx            ;  base address
  199.     mov  ah,1        ;return code for success
  200. X1:    ret              ;
  201. Writeit    endp
  202. GetBIOSCount PROC
  203.     push dx            ;return value in CX:DX
  204.     push ax            ;
  205.     sub  ah,ah        ;function number
  206.     int  1ah        ;get timer count
  207.     mov  cx,dx        ;low word in CX
  208.     pop  ax            ;
  209.     pop  dx
  210.     ret
  211. GetBIOSCount endp
  212. _prt_center endp
  213. _TEXT    ENDS
  214.     END
  215.